rename関数は、ファイルやフォルダ(ディレクトリ)の名前を変更します。この関数で名前を変更するには、他のプロセスでファイルやフォルダを使用していないことや、変更する為の権限を持っていることなどがあります。

#include <stdio.h>
int rename(const char *oldpath, const char *newpath);

*oldpathは名前を変更するファイルやフォルダのパス名を指定します。
*newpathは変更後のパス名を指定します。

第2引数のnewpathの存在する場所により、意味合いが多少変わります。第1引数のoldpathと同じ場所の場合は、名前の変更になりますし、異なる場所の場合は移動になります。

戻り値として、変更できた場合は0を、エラーの場合は-1を返します。

プログラム 例

#include <stdio.h>

int main(int argc, char **argv)
{
  char    ans;
  int     return_code = 0;

  if (argc == 3) {
    printf('%sを%sに変更しますか?(y/n)==> ',
            *(argv + 1), *(argv + 2));
    scanf('%c', &ans);
    if (ans == 'Y' || ans == 'y') {
      if (rename(*(argv + 1), *(argv + 2)) == 0) {
        printf('変更しました\n');
      }
      else {
        printf('変更できませんでした\n');
        return_code = 1;
      }
    }
    else {
      printf('キャンセルします\n');
    }
  }
  else {
    printf('実行時引数の数が不当です\n');
    return_code = 2;
  }

  return return_code;
}

例の実行結果

$ ls -l DIR1
合計 4
-rw-r--r-- 1 user users 75 2008-07-02 11:09 temp_2.txt
$
$ ./rename.exe DIR1 DIR2
DIR1をDIR2に変更しますか?(y/n)==> y
変更しました
$
$ ls -l DIR1 DIR2
ls: cannot access DIR1: そのようなファイルやディレクトリはありません
DIR2:
合計 4
-rw-r--r-- 1 user users 75 2008-07-02 11:09 temp_2.txt
$
$ ./rename.exe DIR2/temp_2.txt DIR2/temp_3.txt
DIR2/temp_2.txtをDIR2/temp_3.txtに変更しますか?(y/n)==> y
変更しました
$
$ ls -l DIR2
合計 4
-rw-r--r-- 1 user users 75 2008-07-02 11:09 temp_3.txt
$
$ ls -l temp*.txt
-rw-r--r-- 1 user users 78 2008-06-06 17:28 temp.txt
-rw-r--r-- 1 user users 20 2008-07-04 09:03 temp_1.txt
$
$ ./rename.exe temp_1.txt ../temp_1.txt
temp_1.txtを../temp_1.txtに変更しますか?(y/n)==> y
変更しました
$
$ ls -l temp*.txt
-rw-r--r-- 1 user users 78 2008-06-06 17:28 temp.txt
$ ls -l ../temp*.txt
-rw-r--r-- 1 user users 20 2008-07-04 09:03 ../temp_1.txt
$